iT邦幫忙

2024 iThome 鐵人賽

DAY 14
1
佛心分享-SideProject30

從卡關到通關的Spring Boot 腦內風暴系列 第 14

品質把關—使用 Spring Boot的過濾器(Filter)

  • 分享至 

  • xImage
  •  

過濾器Filter是Spring Boot當中非常強大的機制,能夠用在處理請求和響應時的預先或事後處理,也就是透過Filter,可以控制在前端請求進入API之前,或是API處理完響應返回給前端之前,執行其他邏輯處理,很常應用於log日誌、數據格式化或驗證會員身分等等,能夠提升程式的安全性或是有效能監控的功能。

使用場景

  • 日誌記錄:用來記錄每個請求的相關資訊,例如請求的URL、方法、參數等,對於除錯或監控很有用。

  • 身份驗證:用來檢查用戶是否具有登入或適當權限,未通過者,會直接於過濾器被阻擋,無法進入到控制層。(驗證身分,使用攔截器會更適合)

  • 數據格式化:可以用來修改請求或響應的數據格式,例如把請求參數轉換為統一的格式,或者於響應返回前先進行資料的壓縮。

使用方式

  • 步驟一:自訂過濾器類別
    過濾器類別需實現javax.servlet.Filter介面:
public class LoggingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, 
                         ServletResponse response, 
                         FilterChain chain) throws IOException, ServletException {
    // 記錄請求的開始時間
        long startTime = System.currentTimeMillis();
    // 繼續處理接下來的過濾器或控制器
        chain.doFilter(request, response);
    // 記錄請求的結束時間
        long endTime = System.currentTimeMillis();
    // 計算並輸出請求處理時間    
        System.out.println("Request processed in " + (endTime - startTime) + " ms");
    }
}

  • 步驟二:在Spring Boot註冊此過濾器
    放入要過濾的路徑給Spring Boot知道:
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<LoggingFilter> loggingFilter() {
        FilterRegistrationBean<LoggingFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new LoggingFilter());
        registrationBean.addUrlPatterns("/api/*"); // 加入要過濾的路徑
        return registrationBean;
    }
}

Filter過濾器的概念不限於Spring Boot
過濾器是屬於Java Servlet規範之一,只要是使用Java Servlet技術的伺服器,如Tomcat,都可以使用過濾器。而透過Spring Boot,過濾器更容易上手使用,因有對其集成與配置,使用上更加簡化,只要使用@Configuration、@Bean註解即可完成過濾器的註冊和配置,不用透過像是web.xml等文件處理:

未使用Spring Boot,而在任何Java EE或Servlet規範應用時,使用web.xml中配置過濾器:

<filter>
    <filter-name>LoggingFilter</filter-name>
    <filter-class>com.example.LoggingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>LoggingFilter</filter-name>
    <url-pattern>/api/*</url-pattern>
</filter-mapping>

上一篇
我傳我傳我傳傳傳—前端請求參數傳入方式
下一篇
逼逼逼!臨檢囉—使用 Spring Boot 中的攔截器
系列文
從卡關到通關的Spring Boot 腦內風暴30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言